public class test {
    public static void main(String[] args) {
//        int year = 1900;
//        //方法的调用
//        boolean flag = isRunNian(2023);
//        System.out.println(flag);
////        int ret = JieCheng(5);
////        System.out.println(ret);
//        System.out.println(JieCheng(5));
//        System.out.println(JieChengAdd(5));
//        int a = 10;
//        int b = 20;
//        swap(a,b);//a b的值不变
//        System.out.println(a+" "+b);
//
//        System.out.println(add(a, b));
//
//        double d1 = 12.5;
//        double d2 = 22.5;
//        System.out.println(add(d1, d2));
//
//        System.out.println(funJieCheng(5));
//
//        printNum(12356);
//
//        System.out.println(sumN(10));
//
//        System.out.println(sumNum(123));
//
//        System.out.println(fbnq(1));
//        System.out.println(fbnq(2));
//        System.out.println(fbnq(3));
//        System.out.println(fbnq(4));
//        System.out.println(fbnq(5));
//
//        System.out.println(fbnq2(1));
//        System.out.println(fbnq2(2));
//        System.out.println(fbnq2(3));
//        System.out.println(fbnq2(4));
//        System.out.println(fbnq2(5));

//        System.out.println(max2(4, 6));
//        System.out.println(max3(4, 7, 9));

//        System.out.println(JC(5));
//        System.out.println(JCH(5));

//        System.out.println(Fbnq(5));

//        int a = 5;
//        int b = 8;
//        double c = 0.12;
//        double d = 0.456;
//        double e = 0.258;
//        double sum = 0;
//        sum = ADD(a,b)+ADD(c,d,e);
//        System.out.println(sum);

//        System.out.println(MAX(20, 30));
//        System.out.println(MAX(20, 54, 40));

        System.out.println(JC2(5));

    }
    //实现一个方法，判断是不是闰年
    public static boolean isRunNian(int year) {
        if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
            System.out.println("是闰年");
            return true;
        }
        System.out.println("不是闰年");
        return false;
    }
    //实现两个整数相加的方法
    public static int add(int a,int b) {
        return a + b;
    }
    //方法的重载： 方法名相同  参数列表不同（数据类型、个数、顺序） 返回值不影响重载
    public static double add(double a,double b) {
        return a + b;
    }

    //方法不能嵌套  也不用声明

    //求 1!+2!+3!+4!+5!
    //分两个方法 先求阶乘  再求和
    //求阶乘
    public static int JieCheng(int n) {
        int ret = 1;
        for (int i = 1; i <= n; i++) {
            ret *= i;
        }
        return ret;
    }
    //用递归求阶乘
    public static int funJieCheng(int n) {
        if(n == 1) {
            return 1;
        }
        int temp = n * funJieCheng(n-1);
        return temp;
    }
    //阶乘求和
    public static int JieChengAdd(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += JieCheng(i);
        }
        return sum;
    }
    //交换两个数的值
    public static void swap(int x,int y) {
        int temp = x;
        x = y;
        y = temp;
        //局部变量的作用域是在方法里面，所以在main中调用这个函数是两个变量不会交换
        //等后面再来学这个
    }

    //递归练习
    //按照顺序打印一个数字的每一位（例如1234打印出1 2 3 4）
    public static void printNum (int num) {
        if (num < 10) {
            System.out.println(num);
            return;
        }
        printNum(num/10);
        System.out.println(num%10);
    }
    //求1+2+3+4+5+6+7+8+9+10
    public static int sumN (int n) {
        if (n == 1) {
            return 1;
        }
        int temp = n + sumN(n - 1);
        return temp;
    }
    //输入一个非负整数，返回组成他的数字之和 例如输入1729，返回1+7+2+9=19
    public static int sumNum (int num) {
        if (num < 10) {
            return num;
        }
        int temp = sumNum(num/10) + num%10;
        return temp;
    }
    //求斐波那契数列的第N项  0 1 1 2 3 5 8 13 ...
    //这个不适合用递归，适合用循环，时间复杂度会低很多
    public static int fbnq(int n) {
        if (n == 1) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }
        return fbnq(n - 1) + fbnq(n - 2);
    }
    //用循环写
    public static int fbnq2(int n) {
        if (n == 1) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }
        int f1 = 0;
        int f2 = 1;
        int f3 = -1;
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }

    //创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
    public static int max2(int a,int b) {
        int max2 = 0;
        return max2 = (a > b ? a : b);
    }
    public static int max3(int x,int y,int z) {
        int max3 = 0;
        return max3 = (max2(x,y) > z ? max2(x,y) : z);
    }

    //递归求 N 的阶乘
    public static int JC(int n) {
        if (n == 1) {
            return 1;
        }
        int temp = 1;
        temp = n * JC(n - 1);
        return temp;
    }

    //求1！+2！+3！+4！+........+n!的和
    public static int JCH(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum = sum + JC(i);
        }
        return sum;
    }

    //求斐波那契数列的第n项。(迭代实现)
    public static int Fbnq(int n) {
        if (n == 1) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }
        int f1 = 0;
        int f2 = 1;
        int fn = -1;
        for (int i = 3; i <= n; i++) {
            fn = f1 + f2;
            f1 = f2;
            f2 = fn;
        }
        return fn;
    }
    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int ADD(int a,int b) {
        return a + b;
    }
    public static double ADD(double a,double b,double c) {
        return a + b  + c;
    }

    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值
    public static int MAX(int a,int b,int c) {
        int max = 0;
        max = a > b ? a : b;
        if (max < c) {
            max = c;
        }
        return max;
    }
    public static int MAX(int a,int b) {
        int max = 0;
        max = a > b ? a : b;
        return max;
    }

    //求 N 的阶乘
    public static int JC2(int n) {
        int temp = 1;
        for (int i = 1; i <= n; i++) {
            temp = temp * i;
        }
        return temp;
    }
}
